JavaScript é orientado a objetos mas como o conceito de classes e objetos é implementado no
JavaScript ?
Em qualquer linguagem de programação, Classes são declarações de como uma tarefa deve ser realizada,
seus métodos (seriam os verbos ou aquilo que deve ser feito ou processado para realizar a tarefa), a
sequencia que esses métodos devem ser executados,
suas propriedades ou características (duro, mole, quente, frio, alto, baixo, liquido, sólido, etc) e os
valores dessas propriedades (ex.: verbo = aquecer o forno, propriedade: a 180graus,
verbo=esperar o bolo assar, propriedade:por 25 minutos,
característica=solido, valores=ralar/cortar em fatias bem finas,
característica=liquido, propriedade=um copo de 250 ml).
Sendo assim podemos dizer que classes são descrições puramente abstratas porque na realidade
elas não existem realmente, só são modelos, definições, receitas da resolução da tarefa e não
a execução da tarefa em sí.
Na hora que você declara y = new Classe tudo que existe na classe é carregado na memória
(copiado- chamamos isso de instancia o objeto) e a variável y passa a apontar para essa
'cópia' do objeto primitivo e, a partir daí, o objeto y existe realmente independente
do objeto original podendo ser modificado. O objeto y também herda tudo que foi declarado da Classe os
Métodos, propriedades e valores de propriedades da classe.
Infelizmente para que o JavaScript ficasse o menor e mais leve possível ele não é baseada em classes mas sim em protótipos, ou seja, em modelos ou protótipos pré-construídos que podem ser usadas para
contruir outras coisas, herdando dos objetos primitivos suas características.
Você pode achar estranho isso mas é muito comum. No SQL Server tem uma base de dados
chamada model que é um modelo de criação de banco de dados. Ela foi criada e existe somente para ser
um modelo, nada mais, sequer pode ser usada pelo usuário.
Digamos que temos um modelo de objeto (no JavaScript é chamado de protótipo) e ao definir var x = Objeto;
estamos criando a variável x que aponta para o protótipo do objeto. A variável x em sí não é nada
mais que um ponteiro ou indicador
para o protótipo do objeto global do JavasCript.
Quando executamos var y = new Object(); aí sim copiamos modelo objeto na memória (chamamos isso de
instanciar o elemento) e o elemento y aponta para esse objeto na memória e passará a existir
realmente, com todos os Métodos, propriedades e valores de propriedades do objeto.
O objeto y criado dessa maneira 'copiou' o protótipo do objeto para sí tudo que ele tinha
e agora ele existe independentemente do objeto original.
Este assunto é complexo e importante, caso tenha dúvidas veja o site Mozilla
No body da página, logo no começo coloquei o seguinte script:
<script><br />
var x = Object;<br />
var y = new Object;<br />
</script><br />
Ao declarar var x = Object; definimos que a variável x que, pela atribuição,
aponta para o protótipo do objeto mas a variável x não é um objeto,
apenas aponta para o protótipo, na linguagem C chamamos
isso de um ponteiro ou pointer.
Contudo ao declarar var y = new Object; aíi sim copiamos do protótipo de objeto para uma região de
memória e definimos que a variável y herda tudo do prototipo do objeto global inclusive instanciando na
memória, portanto a variável y é um objeto real e separado do protótipo original de objeto do JavaScript.
Abaixo aplico na prática o que falei acima.
Objetos Fundamentais
Os objetos básicos e fundamentais são 'modelos' ou 'protótipos primitivos ' nos quais todos os outros
itens serão criados. Isso inclui objetos que representam objetos gerais, funções e erros.
Object :
O construtor de Object aponta para um protótipo de objeto definido globalmente no JavaScript.
Por este motivo var x = Object; é um simples ponteiro para o protótipo do objeto enquanto o verbo new em
var y = new Object; faz com que o JavaScript copie o prototipo do objeto para a a memória e atribua a
variável y.
Exemplo:
Criei os objetos x e y como descrito acima e abaixo tem um botão que dá um alert nos objetos criados
alert(x) depois alert(y).
Script da funcionalidade acima:
<script>
function fncExibeObjetos() {
var x = Object;
alert(x);
alert(y);
}
</script>
<input type="button" value="Clique aqui para emitir o alert dele" onclick="fncExibeObjetos();" />
Notas : o x.alert(); retornou function Object(){[native code]} que é o protótipo do objeto. Note que
nada em x poderia ser alterado porque ele aponta para um protótipo do JavaScript que foi criado para
servir de modelo e por isso não pode ser alterado.
Depois de instanciado, o alert(y)=[Object Object], ai sim, pode ser alterado mas não seria o protótipo
do Object mas sim a variável y que instanciou o objeto.
Propriedades do construtor de objeto
Object.length : Tem o valor 1 mas só se aplica ao protótipo do objeto, não ao objeto em si.
é um pointer para o protótipo de Object e retorna 1
é um Object e retorna undefined
Note que retorna 1 quando o objeto é um protótipo e undefined quando o Objeto já existe.
Object.prototype : Dá acesso ao protótipo do objeto criado permitindo a adição de propriedades
ao mesmo.
é o pointer para o protótipo de Object-Retorna o Objeto em sí.
é um objeto e retorna undefined.
Retornará a definição do objeto em si, ou um protótipo de objeto ou undefined se já for um objeto criado na
memória.
Métodos do construtor de objeto
Object.assign()
Copia os valores de todas as propriedades próprias enumeráveis de um ou mais objetos de origem para um objeto de destino.
Object.create()
Cria um novo objeto com o objeto de protótipo especificado e propriedades.
Object.defineProperty()
Adiciona a propriedade nomeada descrita por um determinado descritor a um objeto.
Object.defineProperties()
Adiciona as propriedades nomeadas descritas pelos descritores fornecidos a um objeto.
Object.entries()
Retorna uma matriz contendo todos os pares [chave, valor] das propriedades de string enumeráveis do próprio objeto.
Object.freeze()
Congela um objeto: outro código não pode excluir ou alterar nenhuma propriedade.
Object.fromEntries()
Retorna um novo objeto de um iterável de pares de valores-chave (reverte Object.entries).
Object.getOwnPropertyDescriptor()
Retorna um descritor de propriedade para uma propriedade nomeada em um objeto.
Object.getOwnPropertyDescriptors()
Retorna um objeto que contém todos os descritores de propriedade próprios de um objeto.
Object.getOwnPropertyNames()
Retorna uma matriz contendo os nomes de todas as propriedades enumeráveis e não enumeráveis do próprio objeto fornecido.
Object.getOwnPropertySymbols()
Retorna uma matriz de todas as propriedades de símbolo encontradas diretamente em um determinado objeto.
Object.getPrototypeOf()
Retorna o protótipo do objeto especificado.
Object.is()
Compara se dois valores são o mesmo valor. É igual a todos os valores NaN (que diferem tanto da Comparação de Igualdade Abstrata quanto da Comparação Estrita de Igualdade).
Object.isExtensible()
Determina se a extensão de um objeto é permitida.
Object.isFrozen()
Determina se um objeto foi congelado.
Object.isSealed()
Determina se um objeto está lacrado.
Object.keys()
Retorna uma matriz contendo os nomes de todas as propriedades de string enumeráveis do próprio objeto fornecido.
Object.preventExtensions()
Impede qualquer extensão de um objeto.
Object.seal()
Impede que outro código exclua propriedades de um objeto.
Object.setPrototypeOf()
Define o protótipo (ou seja, a propriedade interna [[Prototype]]).
Object.values()
Retorna uma matriz contendo os valores que correspondem a todas as propriedades dos
string enumeráveis do próprio objeto.
Instâncias de objeto e objeto de protótipo de objeto
Todos os objetos em JavaScript são descendentes de Object; todos os objetos herdam métodos e propriedades de
Object.prototype, embora possam ser substituídos.
Por exemplo, os protótipos de outros construtores substituem a propriedade do construtor e fornecem seus
próprios métodos toString ().
As alterações no objeto de protótipo Object são propagadas para todos os objetos, a menos que as
propriedades e métodos sujeitos a essas alterações sejam substituídos posteriormente ao longo da cadeia
de protótipo.
Propriedades
Object.prototype.constructor
Especifica a função que cria o protótipo de um objeto.
Object.prototype.__proto__
Aponta para o objeto que foi usado como protótipo quando o objeto foi instanciado.
Object.prototype.__noSuchMethod__
Permite que seja definida uma função que será executada quando um membro indefinido do objeto for chamado como método.
Object.prototype .__count__
Usado para retornar o número de propriedades enumeráveis diretamente em um objeto definido pelo usuário, mas foi removido.
Object.prototype.__ parent__
Usado para apontar para o contexto de um objeto, mas foi removido.
Métodos
Object.prototype.__defineGetter__()
Associa uma função a uma propriedade que, ao ser acessada, executa aquela função e retorna seu valor de retorno.
Object.prototype.__defineSetter__()
Associa uma função a uma propriedade que, quando definida, executa aquela função que modifica a propriedade.
Object.prototype .__lookupGetter __()
Retorna a função associada à propriedade especificada pelo método__defineGetter__().
Object.prototype.__lookupSetter__()
Retorna a função associada à propriedade especificada pelo método__defineSetter__().
Object.prototype.hasOwnProperty()
Retorna um booleano indicando se um objeto contém a propriedade especificada como uma propriedade direta desse objeto e não herdada por meio da cadeia de protótipo.
Object.prototype.isPrototypeOf()
Retorna um booleano indicando se o objeto ao qual este método é chamado está na cadeia de protótipo do objeto especificado.
Object.prototype.propertyIsEnumerable()
Retorna um booleano indicando se o atributo ECMAScript interno [[Enumerable]] está definido.
Object.prototype.toSource()
Retorna string contendo a fonte de um literal de objeto que representa o objeto que este método é chamado; você pode usar este valor para criar um novo objeto.
Object.prototype.toLocaleString()
Chama toString().
Object.prototype.toString()
Retorna uma representação de string do objeto.
Object.prototype.unwatch()
Remove um ponto de controle de uma propriedade do objeto.
Object.prototype.valueOf()
Retorna o valor primitivo do objeto especificado.
Object.prototype.watch()
Adiciona um ponto de controle a uma propriedade do objeto.
Object.prototype.eval()
Usado para avaliar uma string de código JavaScript no contexto do objeto especificado, mas foi removido.
Excluir uma propriedade de um objeto
Não há nenhum método em um objeto para excluir suas próprias propriedades (por exemplo, Map.prototype.delete ()).
Para fazer isso, é necessário usar o operador delete.
Exemplos
Usando Object fornecidos com tipos indefinidos e nulos.
Os exemplos a seguir armazenam um objeto Object vazio em o:
var o = new objeto ();
var o = new objeto (indefinido);
var o = new objeto (nulo);
Usando Object para criar objetos Boolean
Os exemplos a seguir armazenam objetos booleanos em o:
var o = new objeto (verdadeiro); // equivalente a o = new Boolean (true);
var o = new objeto (Boolean ()); // equivalente a o = new Boolean (false);